# ===== 截取 =====
# 单个字符
s = "hello"
#=> "hello"
s[0]  # 第一个字符
#=> "h"
s[s.length - 1] # 左边数字符串长度减1个，即最后一个字符，左边数下标从0开始
#=> "o"
s[-1]  # 右边数第一个字符
#=> "o"
s[-s.length]   # 右边数字符串长度个，即第一个字符
#=> "h"
s[10]  # 索引超出范围
#=> nil

# 子串
s = "hello"
#=> "hello"
s[2..3]    # 位于索引2到3的字符
#=> "ll"
s[-3..-1] # 可以使用负的索引值，代表从右向左
#=> "llo"
s[0..0]    # 第一个字符
#=> "h"
s[0..1]    # 前两个字符
#=> "he"
s[2..1]    # 起始索引大于结束索引，为空字符串
#=> ""
s[7..10]  # 索引超出范围
#=> nil

# ===== 替换 =====
# 替换单个
s = "hello"
#=> "hello"
s[0] = "H"  # 将第一个字符替换为新字符
#=> "H"
s
#=> "Hello"
s[-2] = "L" # 将右边数第2个字符替换为新字符
#=> "L"
s
#=> "HelLo"
s[-1] = "UU" # 将右边数第1个字符替换为新字符集
#=> "UU"
s
#=> "HelLUU"
s[10] = "U"  # 抛出异常，索引超出范围
IndexError: index 10 out of string

# 替换子集
s = "hello"
#=> "hello"
s[-2..-1] = "pas"  # 将从右数第2到第1个字符替换为新值
#=> "pas"
s
#=> "helpas"
s[0..0] = "please "  # 将第一个字符替换为新值
#=> "please "
s
#=> "please elpas"
s[6..10] = ""  # 将第6到10个字符替换为空值，即删除子串
#=> ""
irb(main):029:0> s
#=> "pleases"

# 包含
s = "hello"
#=> "hello"
s["el"]  # 测试是否包含子串，包含的情况
#=> "el"
s["LL"]  # 不包含的情况
#=> nil
while(s["l"])   # 循环测试，将匹配到的所有子串替换为新值
s["l"]="L"
end
#=> nil
s
#=> "heLLo"

# https://www.jianshu.com/p/d7042fd4b2d6